
import { spawn } from 'child_process';
import fs from 'fs';
import path from 'path';

/**
 * 从 MP4 文件提取音频并保存为 MP3 文件
 * @param {string} inputPath - MP4 文件的输入路径
 * @param {string} outputPath - MP3 文件的输出路径
 * @returns {Promise<void>} - 返回一个 Promise，表示提取过程的完成或失败
 */
const extractAudio = (inputPath, outputPath) => {
  return new Promise((resolve, reject) => {
    // 检查输入文件是否存在
    if (!fs.existsSync(inputPath)) {
      return reject(new Error(`输入文件不存在: ${inputPath}`));
    }

    // 确保输出目录存在
    const outputDir = path.dirname(outputPath);
    if (!fs.existsSync(outputDir)) {
      fs.mkdirSync(outputDir, { recursive: true });
    }

    // 执行 ffmpeg 命令提取音频
    const ffmpeg = spawn('ffmpeg', [
      // '-y',
      // '-i', inputPath,
      // '-vn',
      // '-bsf:a', 'aac_adtstoasc',
      // '-ar', '24000',
      // '-q:a', '6',
      // '-acodec', 'libmp3lame',
      // outputPath

      '-y',                  // 覆盖输出文件（如果存在）
      '-i', inputPath,       // 输入文件
      '-vn',                // 禁用视频处理（只提取音频）
      // '-bsf:a', 'aac_adtstoasc',  // 应用音频比特流过滤器
      '-ar', '44100',       // 设置音频采样率为 24kHz
      '-q:a', '6',          // 设置音频质量（VBR模式下的质量级别）
      '-acodec', 'libmp3lame',  // 使用 LAME 编码器生成 MP3
      outputPath            // 输出文件

      // '-i', inputPath,        // 输入文件
      // '-q:a', '0',           // 音频质量设置为最高
      // '-map', 'a',           // 只提取音频流
      // '-y',                  // 覆盖输出文件（如果存在）
      // outputPath             // 输出文件
    ]);

    // 收集错误输出
    let errorOutput = '';
    ffmpeg.stderr.on('data', (data) => {
      errorOutput += data.toString();
    });

    // 处理命令执行完成事件
    ffmpeg.on('close', (code) => {
      if (code === 0) {
        // 成功完成
        resolve();
      } else {
        // 命令执行失败
        reject(new Error(`ffmpeg 进程退出，错误码: ${code}\n${errorOutput}`));
      }
    });

    // 处理可能的错误
    ffmpeg.on('error', (err) => {
      reject(new Error(`无法启动 ffmpeg 进程: ${err.message}`));
    });
  });
};

export default extractAudio;